// pages/cart/index.js
// 1 获取用户的收获地址
//    1.绑定点击事件
//    2.调用小程序内置api wx.chooseAddress 获取用户的收获地址

//    2a.获取用户对小程序 所授权 wx.getSetting  获取地址的 权限状态 SCOPE
//       1.假设用户点击获取用户地址的提示框 确定 
//             scope.address=true 
//            直接调用获取收获地址
//       2.假设用户点击获取用户地址的提示框 取消
//              scope.address=false
//             诱导用户打开授权设置页面，重新给予收取地址权限 wx.openSetting
//       3.假设用户从没有调用过收获地址的api
//             scope= undefined
//             直接调用获取收获地址 
//       4.把获取到的收获地址存到缓存中
//  2.页面加载完毕要做的事情
//       0.onload onshow
//       1.获取本地存储中的地址数据
//       2.获取本地存储中的购物车数据
//       2.把数据设置给data中的变量
// 3.全选的实现 数据得展示
//   1.获取缓存中的购物车数组
//    2.根据购物车中的商品数据 所有的商品都被选中 checked=true 全选就被选中
// 4.总价格和总数量
//   1.都需要商品被选中
//   2.获取购物车数组
//   3.遍历
//   4.判断商品是否被选中
//   5.总价+=商品的单价*商品的数量
//   6.总数量+=商品的数量
//   7.把计算后的价格和数量设置回data中
// 5.商品的选中功能
//   1.绑定change事件
//   2.获取到被修改的商品对象
//   3.商品对象的选中状态进行取反
//   4.重新填充回data中和缓存中
//   5.重新计算 全选、总价格、总数量
// 6.全选和反选功能
//    1.全选复选框绑定事件
//    2.获取DATA中的全选变量 allchecked
//    3.直接取反 allchecked=!allchecked
//    4.遍历购物车数组 让里面的商品状态跟随allchecked改变
//    5.重新填充回data中和缓存中
//    6.重新计算 全选、总价格、总数量
//  7.商品数量的编辑
//    1."+" /"-"按钮绑定点击事件 区分的关键在于自定义属性
//      a."+" "+1"
//      b."-" "-1"
//    2.传递被点击的商品id goods——id
//    3.获取data中的购物车数组 来获取需要修改的数据
//    4.当用户点击“-”号时，同时商品的数量num=1
//       a.弹窗提示 wx.showModal ，用户是否删除
//          a.确定 删除 商品
//          b.取消  无操作  
//    4.直接修改商品对象的数量 num
//    5.把cart数组 重新设置回缓存中和data中 setcart
//   8.判断购物车是否为空
//     1.判断cart数组的长度是否为0
//   9.点击结算
//     1.判断有没有地址
//     2.判断用户有没有选购商品
//     3.通过以上验证，跳转到支付页面


//引入 promise 形式getsetting 请求的方法
import{ getSetting,chooseAddress,openSetting,showModal,showToast} from '../../utils/asyncwx.js'
import regeneratorRuntime from '../../lib/runtime/runtime'
Page({

  /**
   * 页面的初始数据
   */
  data: {
      address:{}, //收获地址 ，默认空对象
      cart:[], //购物车数组
      totalprice:0, //总价格
      totalnum:0, //总数量
      allchecked:false //全选状态
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

  },
  handleChooseAddress_old(){//点击收获地址
    /*经典写法
    //1.获取 权限状态
    wx.getSetting({
      success: (result)=>{
        //2.获取权限状态
        let {authSetting:res}=result
        let scopeaddress=res['scope.address'] //属性名很怪异的时候要使用【】形式来获取属性值       
        console.log(scopeaddress)
        if(scopeaddress===true||scopeaddress==undefined){
          //用户地址的提示框 确定  或者 用户从没有调用过收获地址的api
          wx.chooseAddress({ //2.调用小程序内置api 获取用户的收获地址
            success: (resultADD)=>{
              console.log(resultADD)
              
            }
          });
        }else{
          //户点击获取用户地址的提示框 取消
          wx.openSetting({
            success: (result)=>{
              
            },
            fail: ()=>{},
            complete: ()=>{}
          });
        }        
      }
    }); */
    
  

  },
  async handleChooseAddress_new1(){//点击收获地址优化第一版
      //2.获取权限状态 
      let { authSetting: res } = await getSetting()
      let scopeaddress=res['scope.address'] //属性名很怪异的时候要使用【】形式来获取属性值       
      console.log(scopeaddress)
      if(scopeaddress===true||scopeaddress==undefined){
        //用户地址的提示框 确定  或者 用户从没有调用过收获地址的api
        let resultADD = await chooseAddress() //2.调用小程序内置api 获取用户的收获地址
        console.log(resultADD)
      }else{
        //户点击获取用户地址的提示框 取消
        await openSetting() 
        // 调用收获地址api
        let resultADD = await chooseAddress() //2.调用小程序内置api 获取用户的收获地址
        console.log(resultADD)
      
      }   
  },
  async handleChooseAddress(){//点击收获地址优化最终版
    try {
      //2.获取权限状态 
      let { authSetting: res } = await getSetting()
      let scopeaddress=res['scope.address'] //属性名很怪异的时候要使用【】形式来获取属性值       
      console.log(scopeaddress)
      if(scopeaddress===false){
        //户点击获取用户地址的提示框 取消     
        await openSetting() 
      }
      let address = await chooseAddress() //2.调用小程序内置api 获取用户的收获地址
      console.log(address) 
      address.addall=address.provinceName+address.cityName+address.countyName+address.detailInfo
      wx.setStorageSync("address", address); // 4.把获取到的收获地址存到缓存中
        
    } catch (error) {
      console.log(error)
      
    }
    
},
setcart(cart){//设置工具栏状态 全选、总价、总数量
  
   wx.setStorageSync("cart",cart)
   // 计算全选
      //  every (检测数组中的每一项是否符合条件)
      //  可以理解成 && '且'的关系
      // 只要有一个为false 则不再执行循环，直接返回false
   const allchecked=cart.length?cart.every((item,index)=> item.checked):false
   // 计算总价格
   let totalprice=0
   let totalnum=0
  
   cart.forEach(v => {
     if(v.checked){ //被选中时才计算
       totalprice=totalprice+v.goods_price*v.num
       totalnum=totalnum+v.num
     }
   });
   console.log('init adata=====')
   console.log(cart)
   console.log('allchecked',allchecked)
   console.log('totalprice',totalprice)
   console.log('totalnum',totalnum)
   //2.给data赋值
   this.setData({    
     allchecked,
     totalprice,
     totalnum,
     cart
   })
},
checkboxAll(e){//全选选中
  console.log('all checked')
  let checked=e.currentTarget.dataset.checks
  console.log('checkedall=',checked)
  let allchecked=!this.data.allchecked
  let {cart}=this.data
  //    4.遍历购物车数组 让里面的商品状态跟随allchecked改变
  cart.forEach(v=>{
    v.checked=allchecked
  })
  this.setcart(cart)

},
async itemNumEdit(e){//商品点击减号- +
  console.log('item num edit')
  //1.获取传递过来的参数
  const {id,op}=e.currentTarget.dataset   
  console.log('id=',id) 
  console.log('op=',op)
  //2.获取购物车
  let {cart}=this.data
  //3.获取需要修改的商品索引
  const index = cart.findIndex((value, index, arr) => {
    return value.goods_id ===id
   })
  console.log('index=',index)
  //4.修改数量
  if (cart[index].num===1&&op===-1){
    let {confirm}=await showModal({content:"是否要删除该商品？"})
    console.log(confirm)
    if (confirm){
      //确认 删除该商品
      cart.splice(index,1)
      //5.设置回缓存和dataset中
      console.log(cart)
      this.setcart(cart)
    }
    /*
    wx.showModal({
      title: '提示',
      content: '是否要删除该商品？',
      showCancel: true,
      cancelText: '取消',
      cancelColor: '#000000',
      confirmText: '确定',
      confirmColor: '#3CC51F',
      success: (result) => {
        if(result.confirm){//确定
          //删除该商品
          cart.splice(index,1)
          //5.设置回缓存和dataset中
          console.log(cart)
          this.setcart(cart)
        }
      },
      fail: ()=>{},
      complete: ()=>{}
    });*/

  }else{
    cart[index].num+=op
    //5.设置回缓存和dataset中
    console.log(cart)
    this.setcart(cart)
  }
  
  /*
  if (op===1){
    console.log('add')
    cart[index].num++
    cart[index].checked=true
    
  }else{
    console.log('sub')
    if (cart[index].num>0){
      cart[index].num--
      if (cart[index].num===0){
        cart[index].checked=false
      }
      
    }
  }*/
  
  

},
checkboxChange(e){//商品选中 checkbox
  //   2.获取到被修改的商品对象
  let index=e.currentTarget.dataset.index
  console.log(index)
  let {cart}=this.data
  //   3.商品对象的选中状态进行取反
  cart[index].checked=!cart[index].checked  
  this.setcart(cart)
  
},
async handlepay(e){//点击支付
  console.log('pay')
  const{address,cart}=this.data

//1.判断有没有地址
if (!address.userName){
  await showToast({title:'您还没有地址！',icon:'none'})
  return false
}
//     2.判断用户有没有选购商品
if (cart.length===0){
  await showToast({title:'您还没有选购商品！',icon:'none'})
  return false
}
//     3.通过以上验证，跳转到支付页面
 wx.navigateTo({
   url: '/pages/pay/index'
   
 });
},
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
      //1.获取缓存中的收获地址信息
      const address=wx.getStorageSync('address')
      //2.给data赋值
      this.setData({    
        address,       
      })
      console.log(address)
       //   2.获取缓存中的购物车数据 数组格式
      const cart=wx.getStorageSync("cart")||[]; //第一次是空则赋值为空数组      
      this.setcart(cart)   
     

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})